
package com.jf.cloud.product.service;

import com.jf.cloud.common.order.bo.RefundReductionStockBO;
import com.jf.cloud.common.product.dto.SkuDTO;
import com.jf.cloud.product.bo.SkuZoneInfoBO;
import com.jf.cloud.product.model.SkuStock;
import com.jf.cloud.product.vo.SkuStockVO;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 库存信息
 *
 * @author zz
 * @date 2020-10-28 15:27:24
 */
public interface SkuStockService {

    /**
     * 批量保存库存信息
     * @param skuStocks 库存信息
     */
    void batchSave(List<SkuStock> skuStocks);

    /**
     * 批量更新sku库存信息
     * @param skuList
     */
    void updateBatch(List<SkuDTO> skuList);

    /**
     * 因为退款所以需要还原库存
     * @param refundReductionStocks
     */
    void reductionStock(List<RefundReductionStockBO> refundReductionStocks);

    /**
     * 根据商品id获取库存信息
     *
     * @param spuId
     * @return
     */
    List<SkuStockVO> listStockBySpuId(@Param("spuId") Long spuId);

    /**
     * 通过供应商的spuId，获取商家对应的sku库存
     * @param spuId
     * @param shopId
     * @return
     */
    List<SkuStockVO> listShopStockBySpuIdAndShopId(Long spuId, Long shopId);

    /**
     * 获取指定sku的库存
     * @param skuId
     * @return
     */
    SkuStock getBySkuId(Long skuId);

    /**
     * 根据skuId判断 sku是否进行了分片
     * @param skuId
     * @return
     */
    SkuZoneInfoBO getZoneInfo(Long skuId);

    /**
     * 通过skuId获取总库存，其中包含了分片库存
     * @param skuId skuId
     * @return
     */
    Integer getTotalBySkuId(Long skuId);

    /**
     * 根据商品获取总库存，有缓存，如果分片了包含分片，不包括被禁用的sku的库存
     * @param spuId
     * @return
     */
    Integer getTotalBySpuId(Long spuId);

    /**
     * 获取商品是否有sku分片过
     * @param spuId
     * @return
     */
    Integer getSkuZoned(Long spuId);

    /**
     * 根据商品id获取分片库存
     * @param spuId
     * @return
     */
    List<SkuStockVO> listSkuStockWhichZoneBySpuId(Long spuId);

    /**
     * 通过商品编码，获取商家对应的库存
     * @param partyCodes
     * @param shopId
     * @return
     */
    List<SkuStockVO> listShopStockByPartyCodesAndShopId(List<String> partyCodes, Long shopId);

    /**
     * 分片后sku更改库存
     * @param skuId
     * @param changeCount
     * @param spuId
     * @return
     */
    int changeSkuWhenZone(Long skuId, Integer changeCount, Long spuId);
}
